import time
import socket
import re
import threading

"模块文件，上传本地文件到服务端"

# 读取serverip.txt文件，返回一个列表，每个元素的格式：ip:port
def get_server_lists():
    ip_lists = []
    rfiles = open('serverip.txt','r')
    rs = rfiles.readlines()
    for s in rs:
        s1 = s.replace('\n','')
        if not s1.startswith('#'):
            ip_lists.append(s1)
    return ip_lists

# 创建socket会话，收发数据
def tcp_socket_client(tcpsocket, ip, port, filename, filepath):
    try:
        tcpsocket.connect((ip,port))
        #print('%s:连接成功'%ip)

        #输入需要执行的选择，发送给服务端
        tcpsocket.send('3'.encode('utf-8'))

        # 接收服务器返回的消息
        rec_data = tcpsocket.recv(1024)
        #print(ip + ':' + rec_data.decode('gbk'))

        # 发送相应信息给服务端
        tcpsocket.send(filename.encode('utf-8'))
        time.sleep(0.1)
        tcpsocket.send(filepath.encode('utf-8'))
        time.sleep(0.1)
        # 读取文件内容,只支持txt或bat的小文件
        rfiles = open(filename,'rb')
        content = rfiles.read()
        tcpsocket.send(content)

        # 读取服务端返回的状态
        rec_data1 = tcpsocket.recv(1024)
        print('%s:%s'%(ip,rec_data1.decode('gbk')))

        tcpsocket.close()

    except:
        print('%s:连接失败'%ip)

# 主函数
def main():
    print(r'上传文件的文件名如1.txt，文件请放在当前目录下，上传只支持txt或bat的小文件,且文件内容无中文')
    filename = input()
    print(r'文件上传到服务器那个文件夹下，例如D:\\tdx\\')
    filepath = input()

    # 多线程
    th_lists = []
    for s in get_server_lists():
        ip = re.split(':',s)[0]
        port = int(re.split(':',s)[1])
        try:
            tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            #调用功能函数three
            th = threading.Thread(target=tcp_socket_client,args=(tcp_socket,ip,port,filename,filepath))
            th_lists.append(th)
        except:
            print('%s:文件发送失败，线程关闭'%ip)
            tcp_socket.close()
    
    for t in th_lists:
        t.start()
        time.sleep(0.5)
    
    for t in th_lists:
        t.join()